package com.yinhd.study.threadTest;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashSet;
import java.util.Set;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * @program: study
 * @description:
 * @Author: yinhd
 * @create: 2022-07-06 11:04
 *
 **/
//应用1
// 解决不同线程操作线程不安全的方法;使用此方法的原因是：其实为每一个线程去创建一个方法也可以避免多线程导致的冲突问题，
// 但是面对大量的多线程并发，单独为每一个线程new 一个这样的方法显然是不合适的；
// 可以为线程池中的每一个线程new出来，而不是运行一个线程 new 一个方法

// simpleDateFormat 的进化之路
public class ThreadLocalTest1 {

    public static  ExecutorService executorService = Executors.newFixedThreadPool(10);
    static Set<String> set = new HashSet();
    public static void main(String[] args) throws InterruptedException {
        ThreadLocalTest1 threadLocalTest1 = new ThreadLocalTest1();
        for (int i = 0; i < 1000; i++) {
            int finalI = i;
            executorService.submit(() -> {
                String date =  threadLocalTest1.date(Long.parseLong(String.valueOf(finalI)));
                System.out.println(date);
                set.add(date);
            });
        }
        Thread.sleep(5000);
        System.out.println(set.size());
    }
    public  String date(Long time){
        Date date = new Date(1000*time);
        SimpleDateFormat dateFormat = ThreadSafeFormatter.dateFormatThreadLocal.get();
        String format = dateFormat.format(date);
        return format;
    }
}

class ThreadSafeFormatter{
    public static ThreadLocal<SimpleDateFormat> dateFormatThreadLocal
            = ThreadLocal.withInitial(() -> new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"));
}


